#pragma once
#include "cgzAFun.h"

class cgzCThreadPool;
class cgzITask;
// 任务数据基类
class cgzIData
{
public:
    virtual ~cgzIData();

public:
    int target; // 指定目标
    int origin; // 任务来源
};

// 任务接口基类
class cgzITask
{
public:
    cgzITask(cgzCThreadPool *pool, const char *name, cgzETask tenum);
    virtual bool run(int64_t nms) = 0;

public:
    virtual bool retTask(cgzIData *cgzTask);//结果任务
    virtual bool addTask(cgzIData *cgzTask);//分配任务

public:
    int getId() const;
    const char *getName() const;
    cgzETask getTEnum() const;

public:
    //注册服务
    virtual bool regTask(const char *target, cgzIData *pTask);

public:
    virtual bool setFree();  // 设置空闲
    virtual bool setBusy();  // 设置忙碌
    virtual bool basBusy();  // 是否忙碌
    virtual bool casBusy();  // 可以忙吗
    virtual void service();  // 注册服务
    virtual bool shutdown(); // 停止标记
    virtual bool mabystop(); // 可以停止
    virtual bool realstop(); // 真实停止

public:
    cgzCThreadPool *getPool();

public:
    std::list<cgzIData *> m_runTask; // 被分配得任务队列
    std::list<cgzIData *> m_retTask; // 执行后的任务队列
    std::list<cgzIData *> m_synTask; // 自产生的任务队列
protected:
    int m_id;
    std::string m_name;
    cgzETask m_tenum;

protected:
    std::atomic<bool> m_busy;
    std::atomic<bool> m_bShutdown;
    std::atomic<bool> m_bRunning;

public:
    cgzCThreadPool *m_pool;
    std::atomic<int64_t> m_runms = {-1}; // 下次执行时间
    std::shared_mutex m_rwmutex;         // 读写锁
    std::thread *m_thread;               // 线程句柄
public:
    int m_tref = -1; // lua引用
};